home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
BCI NET
/
BCI NET Dec 94.iso
/
archives
/
programming
/
e
/
mui22edev2.lha
/
Amiga_E
/
Sources
/
PopUp.em
< prev
Wrap
Text File
|
1994-10-10
|
7KB
|
303 lines
/*
** Original C Code written by Stefan Stuntz
**
** Translation into E by Jan Hendrik Schulz
**
*/
/*
** Loading the needed MODULEs
*/
MODULE 'muimaster', 'libraries/mui'
MODULE 'utility/tagitem', 'utility/hooks'
MODULE 'intuition/classes', 'intuition/classusr'
MODULE 'libraries/asl'
/*
** defining some CONSTs
*/
ENUM ER_NON, ER_MUILIB, ER_APP
/*
** Now the two hook-functions
*/
PROC hook_StrObjFunc(pop,str)
DEF x,s,i
get(str,MUIA_String_Contents,{s})
i:=0
LOOP
doMethod(pop,[MUIM_List_GetEntry,i,{x}])
IF x=NIL
set(pop,MUIA_List_Active,MUIV_List_Active_Off)
RETURN MUI_TRUE
ELSEIF StrCmp(x,s,ALL)
set(pop,MUIA_List_Active,i)
RETURN MUI_TRUE
ENDIF
INC i
ENDLOOP
ENDPROC
PROC hook_ObjStrFunc(pop,str)
DEF x
doMethod(pop,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{x}])
set(str,MUIA_String_Contents,x)
ENDPROC
/*
** main PROC with exception handling
*/
PROC main() HANDLE
DEF popNames
DEF hookStrObj:hook, hookObjStr:hook
DEF app,window,pop1,pop2,pop3,pop4,pop5,plist
DEF signals, result, active, running=TRUE
/*
** creating the hooks
*/
installhook(hookStrObj, {hook_StrObjFunc})
installhook(hookObjStr, {hook_ObjStrFunc})
/*
** creating array for PopUp
*/
popNames := [ 'Stefan Becker',
'Martin Berndt',
'Georg Heßmann',
'Martin Horneffer',
'Martin Huttenloher',
'Kai Iske',
'Oliver Kilian',
'Franke Mariak',
'Klaus Melchior',
'Armin Sander',
'Matthias Scheler',
'Andreas Schildbach',
'Wolfgang Schildbach',
'Christian Scholz',
'Markus Stipp',
'Ibrahim Solmaz',
'Henri Veistera',
'Alber Weinert',
NIL ]
/*
** open muimaster.library
*/
IF (muimasterbase := OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN))=NIL THEN Raise(ER_MUILIB)
/*
** creating the application
*/
app := ApplicationObject,
MUIA_Application_Title , 'Popup-Demo',
MUIA_Application_Version , '$VER: Popup-Demo 8.37 (03.07.94)',
MUIA_Application_Copyright , '©1993, Stefan Stuntz',
MUIA_Application_Author , 'Stefan Stuntz',
MUIA_Application_Description, 'Demostrate popup objects.',
MUIA_Application_Base , 'POPUP',
SubWindow, window := WindowObject,
MUIA_Window_Title, 'Popup Objects',
MUIA_Window_ID , "POPP",
WindowContents, VGroup,
Child, ColGroup(2),
Child, KeyLabel2('File:',"f"),
Child, pop1 := PopaslObject,
MUIA_Popstring_String, KeyString(0,256,"f"),
MUIA_Popstring_Button, PopButton(MUII_PopFile),
ASLFR_TITLETEXT, 'Please select a file...',
End,
Child, KeyLabel2('Drawer:',"d"),
Child, pop2 := PopaslObject,
MUIA_Popstring_String, KeyString(0,256,"d"),
MUIA_Popstring_Button, PopButton(MUII_PopDrawer),
ASLFR_TITLETEXT , 'Please select a drawer...',
ASLFR_DRAWERSONLY, MUI_TRUE,
End,
Child, KeyLabel2('Font:',"o"),
Child, pop3 := PopaslObject,
MUIA_Popstring_String, KeyString(0,80,"o"),
MUIA_Popstring_Button, PopButton(MUII_PopUp),
MUIA_Popasl_Type , ASL_FONTREQUEST,
ASLFO_TITLETEXT , 'Please select a font...',
End,
Child, KeyLabel2('Fixed Font:',"i"),
Child, pop4 := PopaslObject,
MUIA_Popstring_String, KeyString(0,80,"i"),
MUIA_Popstring_Button, PopButton(MUII_PopUp),
MUIA_Popasl_Type , ASL_FONTREQUEST,
ASLFO_TITLETEXT , 'Please select a fixed font...',
ASLFO_FIXEDWIDTHONLY, MUI_TRUE,
End,
Child, KeyLabel2('Thanks To:',"n"),
Child, pop5 := PopobjectObject,
MUIA_Popstring_String, KeyString(0,60,"n"),
MUIA_Popstring_Button, PopButton(MUII_PopUp),
MUIA_Popobject_StrObjHook, hookStrObj,
MUIA_Popobject_ObjStrHook, hookObjStr,
MUIA_Popobject_Object, plist := ListviewObject,
MUIA_Listview_List, ListObject,
InputListFrame,
MUIA_List_SourceArray, popNames,
End,
End,
End,
End,
End,
End,
End
IF app=NIL THEN Raise(ER_APP)
doMethod(window,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,
app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit])
doMethod(window,[MUIM_Window_SetCycleChain,pop1,pop2,pop3,pop4,pop5,NIL])
/* A double click terminates the popping list with a successful return value. */
doMethod(plist,[MUIM_Notify,MUIA_Listview_DoubleClick,MUI_TRUE,
pop5,2,MUIM_Popstring_Close,MUI_TRUE])
/*
** Input loop...
*/
set(window,MUIA_Window_Open,MUI_TRUE);
WHILE running
result := doMethod(app,[MUIM_Application_Input,{signals}])
SELECT result
CASE MUIV_Application_ReturnID_Quit
get(pop1,MUIA_Popasl_Active,{active})
IF active=FALSE THEN get(pop2,MUIA_Popasl_Active,{active})
IF active=FALSE THEN get(pop3,MUIA_Popasl_Active,{active})
IF active=FALSE THEN get(pop4,MUIA_Popasl_Active,{active})
IF active
Mui_RequestA(app,window,0,NIL,'OK','Cannot quit now, still\nsome asl popups opened.',NIL)
ELSE
running := FALSE
ENDIF
ENDSELECT
IF running OR signals THEN Wait(signals)
ENDWHILE
set(window,MUIA_Window_Open,FALSE)
/*
** Shut down...
*/
Raise(ER_NON)
EXCEPT
IF app THEN Mui_DisposeObject(app)
IF muimasterbase THEN CloseLibrary(muimasterbase)
SELECT exception
CASE ER_MUILIB
WriteF('Failed to open \s.\n',MUIMASTER_NAME)
CleanUp(20)
CASE ER_APP
WriteF('Failed to create application.\n')
CleanUp(20)
ENDSELECT
ENDPROC 0
/*
** doMethod (written by Wouter van Oortmerssen)
*/
PROC doMethod( obj:PTR TO object, msg:PTR TO msg )
DEF h:PTR TO hook, o:PTR TO object, dispatcher
IF obj
o := obj-SIZEOF object /* instance data is to negative offset */
h := o.class
dispatcher := h.entry /* get dispatcher from hook in iclass */
MOVEA.L h,A0
MOVEA.L msg,A1
MOVEA.L obj,A2 /* probably should use CallHookPkt, but the */
MOVEA.L dispatcher,A3 /* original code (DoMethodA()) doesn't. */
JSR (A3) /* call classDispatcher() */
MOVE.L D0,o
RETURN o
ENDIF
ENDPROC NIL
/*
** installhook (written by Wouter van Oortmerssen)
*/
PROC installhook(hook,func)
DEF r
MOVE.L hook,A0
MOVE.L func,12(A0)
LEA hookentry(PC),A1
MOVE.L A1,8(A0)
MOVE.L A4,16(A0)
MOVE.L A0,r
ENDPROC r
hookentry:
MOVEM.L D2-D7/A2-A6,-(A7)
MOVE.L 16(A0),A4
/* MOVE.L A0,-(A7) I never need a PTR to the hook-structure in my
hook-functions! therefore I removed this.*/
MOVE.L A2,-(A7)
MOVE.L A1,-(A7)
MOVE.L 12(A0),A0
JSR (A0)
LEA 8(A7),A7 /* Changed from LEA 12... to LEA 8... because of
the removed MOVE above */
MOVEM.L (A7)+,D2-D7/A2-A6
RTS
/*
** End Of File
*/